""" 遍历当目录和子目录下的头文件，从头文件中获取类名以及父类和继承方式，成员变量以及成员变量的类型，成员函数以及成员函数的参数和返回值 """
import os
import re

def get_class_name(content):
    """ 获取类名 """
    class_name = re.findall(r"class\s+(\w+)\s*:", content)
    return class_name

def get_class_parent(content):
    """ 获取父类 """
    class_parent = re.findall(r"class\s+\w+\s*:\s*public\s+(\w+)", content)
    return class_parent

def get_class_parent_type(content):
    """ 获取继承方式 """
    class_parent_type = re.findall(r"class\s+\w+\s*:\s*(\w+)\s+\w+", content)
    return class_parent_type

def get_private_members(content):
    """ 获取私有成员变量 """
    private_members = re.findall(r"private:\s*(\w+\s+\w+;)", content)
    return private_members

def get_public_methods(content):
    """ 获取共有成员函数 """
    public_methods = re.findall(r"public:\s*(\w+\s+\w+\(.*\);)", content)
    return public_methods

def get_members_type(content):
    """ 获取成员变量的类型 """
    members_type = re.findall(r"(\w+)\s+\w+;", content)
    return members_type

def get_methods_params(content):
    """ 获取成员函数的参数 """
    methods_params = re.findall(r"\w+\s+\w+\((.*)\);", content)
    return methods_params

def get_methods_return(content):
    """ 获取成员函数的返回值 """
    methods_return = re.findall(r"\w+\s+(\w+)\s*\(", content)
    return methods_return

def get_methods_params_type(content):
    """ 获取成员函数的参数类型 """
    methods_params_type = re.findall(r"(\w+)\s+\w+", content)
    return methods_params_type

def get_methods_params_name(content):
    """ 获取成员函数的参数名 """
    methods_params_name = re.findall(r"\w+\s+(\w+)", content)
    return methods_params_name

def get_methods_return_type(content):
    """ 获取成员函数的返回值类型 """
    methods_return_type = re.findall(r"(\w+)\s+\w+\s*\(", content)
    return methods_return_type

def get_class_info(file_path):
    """ 从头文件中获取类名以及父类和继承方式，成员变量以及成员变量的类型，成员函数以及成员函数的参数和返回值 """
    with open(file_path, "r") as f:
        content = f.read()
        class_name = get_class_name(content)
        class_parent = get_class_parent(content)
        class_parent_type = get_class_parent_type(content)
        private_members = get_private_members(content)
        public_methods = get_public_methods(content)
        members_type = get_members_type(content)
        methods_params = get_methods_params(content)
        methods_return = get_methods_return(content)
        methods_params_type = get_methods_params_type(content)
        methods_params_name = get_methods_params_name(content)
        methods_return_type = get_methods_return_type(content)
        print("class_name: ", class_name)
        print("class_parent: ", class_parent)
        print("class_parent_type: ", class_parent_type)
        print("private_members: ", private_members)
        print("public_methods: ", public_methods)
        print("members_type: ", members_type)
        print("methods_params: ", methods_params)
        print("methods_return: ", methods_return)
        print("methods_params_type: ", methods_params_type)
        print("methods_params_name: ", methods_params_name)
        print("methods_return_type: ", methods_return_type)

def get_all_files(path):
    """ 遍历目录和子目录下的所有文件 """
    files = []
    for root, dirs, file_names in os.walk(path):
        for file_name in file_names:
            files.append(os.path.join(root, file_name))
    return files

def main():
    """ 主函数 """
    path = r"./"
    files = get_all_files(path)
    for file in files:
        if file.endswith(".h"):
            get_class_info(file)

if __name__ == "__main__":
    main()